public class BestLine {
  public int[] bestLine(int[][] points) {
      int n = points.length;
      int[] res = new int[2];
      int max = 0;
      for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
          int cnt = 0;
          for(int k=0;k<n;k++){
            if((points[k][0] - points[i][0]) * (points[j][1] - points[i][1]) == (points[j][0] - points[i][0]) * (points[k][1] - points[i][1])){
              cnt++;
            }
          }
          if(cnt > max){
            max = cnt;
            res[0] = i;
            res[1] = j;
          }
        }
      }
      return res;
        
  }
  public static void main(String[] args) {
      int[][] points = {{0,0},{1,1},{1,0},{2,0}};
      BestLine bl = new BestLine();
      int[] res = bl.bestLine(points);
      System.out.println(res[0] + " " + res[1]);
  }
}

// 给定一个二维平面及平面上的 N 个点列表Points，其中第i个点的坐标为Points[i]=[Xi,Yi]。请找出一条直线，其通过的点的数目最多。

// 设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S，你仅需返回[S[0],S[1]]作为答案，若有多条直线穿过了相同数量的点，则选择S[0]值较小的直线返回，S[0]相同则选择S[1]值较小的直线返回。

// 示例：

// 输入： [[0,0],[1,1],[1,0],[2,0]]
// 输出： [0,2]
// 解释： 所求直线穿过的3个点的编号为[0,2,3]
// 提示：

// 2 <= len(Points) <= 300
// len(Points[i]) = 2

// class Solution {
//     public int[] bestLine(int[][] points) {
//         // 求二维数组元素个数
//         int n = points.length;
//         // 存放返回的最终结果
//         int[] res = null;
//         // 为了找出在一组点中，可以形成点数最多的直线的两个点。
//         int max = 0;
//         // 二维数组遍历
//         for (int i = 0; i < n; i++) {
//             for (int j = i + 1; j < n; j++) {
//                 // 求两点之间的斜率
//                 // y2-y1
//                 int y1 = points[j][1] - points[i][1];
//                 // x2-x1
//                 int x1 = points[j][0] - points[i][0];
//                 // 用来记录形成直线的点的数量
//                 int temp = 1;
//                 // 再求两点之间的斜率
//                 // 注意初始范围
//                 for (int k = j + 1; k < n; k++) {
//                     int y2 = points[k][1] - points[i][1];
//                     int x2 = points[k][0] - points[i][0];
//                     // 在每次循环中，如果找到一个新的点k，使得点i、j和k形成的三点的斜率相等，那么就将temp加1。
//                     if ((y1 * x2 == x1 * y2)) {
//                         temp++;
//                     }
//                 }
//                 // 返回的res就是形成点数最多的直线的两个点，max就是这条直线上的点的数量
//                 if (temp > max) {
//                     max = temp;
//                     res = new int[] { i, j };
//                 }
//             }
//         }
//         return res;
//     }
// }